import cfg from '../config';
import * as ajax from '../lib/kajax';
import {setCache, getCache, removeCache}  from '../lib/kcache';
const $ = require('../lib/kdom');

// 删除一组元素的 class
function removeCls(els, cls, cb) {
  // console.log(els);
  if (els && els.length <= 0) return;
  for (let i = 0; i < els.length; i++) {
    $.removeClass(els[i], cls);
  }
  if (cb) cb();
}

function cityDataCache(val) {
  if (val !== undefined) {
    setCache(cfg.train.trainCityLib, {data: val, date: new Date(), expire: cfg.app.expire});
  } else {
    return getCache(cfg.train.trainCityLib) || '';
  }
}

/*
 * 格式化日期
 @param "yyyy-MM-dd"
 @param new Date(date)

 * formatDate('yyyy-MM-dd'[,new Date()]);
 formatDate('yyyy/MM/dd'[,new Date()]);
 formatDate('yyyy年MM月dd'[,new Date()]);
 @param 'yyyy年MM月dd' 必填参数 ；格式为 -> 字符串 （分隔符 自定义）
 @param [,new Date()] 选填参数 ；格式为 -> 时间对象

 * type为datetime-local
 value设置的格式为：YYYY-MM-DDTHH:mm:ss
 如果需要设置到秒，可以再加入：step=1
 starDateVal.value = formatDate('yyyy-MM-ddThh:mm:ss');
 */
function formatDate(format, newDate) {
  newDate = newDate ? new Date(newDate) : new Date();
  let k, reg,
    o = {
      'y+': newDate.getFullYear(), //year
      'M+': newDate.getMonth() + 1, //month
      'd+': newDate.getDate(), //day
      'h+': newDate.getHours(), //hour
      'm+': newDate.getMinutes(), //minute
      's+': newDate.getSeconds(), //second
    };
  for (k in o) {
    reg = new RegExp('(' + k + ')');
    if (reg.test(format)) format = format.replace(reg, o[k] < 10 ? ('0' + o[k]) : o[k]);
  }
  return format;
}
/*
 function formatDate(format, newDate) {
 if (format) {
 newDate = newDate ? new Date(newDate) : new Date();
 let o = {
 'M+': newDate.getMonth() + 1, //month
 'd+': newDate.getDate(), //day
 'h+': newDate.getHours(), //hour
 'm+': newDate.getMinutes(), //minute
 's+': newDate.getSeconds(), //second
 'q+': Math.floor((newDate.getMonth() + 3) / 3), //quarter
 'S': newDate.getMilliseconds() //millisecond
 };

 if (/(y+)/.test(format)) {
 format = format.replace(RegExp.$1, (newDate.getFullYear() + '').substr(4 - RegExp.$1.length));
 }

 for (let k in o) {
 if (new RegExp('(' + k + ')').test(format)) {
 format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
 }
 }
 return format;
 }
 }
 */

// 前一天
function getPrevDate(currDate) {
  if (!currDate) return;
  currDate = new Date(currDate).getTime();
  return formatDate('yyyy-MM-dd', new Date(currDate - 24 * 60 * 60 * 1000));
}

// 后一天
function getNextDate(currDate) {
  if (!currDate) return;
  currDate = new Date(currDate).getTime();
  return formatDate('yyyy-MM-dd', new Date(currDate + 24 * 60 * 60 * 1000));
}
function getCurrDay(date) {
  const arr = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'];
  let idx = new Date(date).getDay();
  idx = idx === 0 ? (arr.length - 1) : ( idx - 1);
  return arr[idx];
}

function randomColor(str) {
  let rc = `0x${str || 'ffffff'}`;
  return `#${Math.floor(Math.random() * rc).toString(16)}`;
}

// 判断数组包含关系
// true 包含
function isArrContain(arr, obj, key) {
  if (!arr) return; else if (arr.length <= 0) return;
  let i = arr.length;
  while (i--) {
    if (key) {
      if (arr[i][key] == obj[key]) {
        return true;
      }
    } else {
      if (arr[i] == obj) {
        return true;
      }
    }
  }
  return false;
}
// 判断数组不包含关系
// true 不包含
function isArrNoContain(arr, obj, key) {
  // console.log('isArrayNotContain', arr, obj);
  if (!arr) return; else if (arr.length <= 0) return;
  let i = arr.length;
  while (i--) {
    if (key) {
      if (arr[i][key] != obj[key]) {
        return true;
      }
    } else {
      if (arr[i] != obj) {
        return true;
      }
    }
  }
  return false;
}
// 查找字符串
function findStr(str, val) {
  str = str instanceof Array ? str.join(',') : str;
  return new RegExp(',' + val + ',').test(',' + str + ',');
}

// isSelector
function isSelector(val) {
  if (!val) return;
  let rc = null;
  if (val instanceof Object) {
    rc = val;
  } else {
    rc = $.qu(val);
  }
  return rc;
}

// backPage
// str 当前页面的id字符串
function backPage(str, child, cb) {
  if (!str && child) return;
  let tag = $.qu(`${str} .${child}`);
  tag.onclick = () => {
    if (cb) {
      cb();
    }
  };
}
/*
 * 温馨提示
 * @param 当前父页面的ID字符串
 * @param msg
 * */
// message('#TestConyent', '我是首页！');// #TestConyent 父页面的选择器
// closeMsg('#TestConyent');
function message(tid, msg) {
  if (!tid) return;
  let tag = isSelector(tid);
  if (tag) {
    $.html(tag, `<div class="message" id="${tag.id}-message">${msg || '亲！您暂时还没有获取更多的相关信息哦，请重新查询哦！'}</div>`);
  }
}

function closeMsg(tid) {
  if (!tid)return;
  let tag = isSelector(tid);
  if (tag) {
    if ($.id(`${tag.id}-message`)) tag.removeChild($.id(`${tag.id}-message`));
  }
}

//页面进入请求pinyin库
function getPinYin(cb) {
  let rc = localStorage.getItem(cfg.train.pinYin);
  if (rc && cb) {
    cb(JSON.parse(rc));
  } else {
    ajax.get(`${cfg.doc.host}${cfg.doc.pingYin}`, '', (rs) => {
      if (rs) {
        localStorage.setItem(cfg.train.pinYin, rs);
        if (cb) cb(JSON.parse(rs));
      }
    });
  }
}


// 获得乘客，并做会话存储，提供判断差旅用
function getPassengers(cb) {
  // let rc = sessionStorage.getItem(cfg.train.passengerData);
  // if (rc && cb) {
  //   cb(eval('(' + rc + ')'));
  // } else {
  ajax.post(`${cfg.train.host}${cfg.train.getICBCPassenger}`, '', (err, rs) => {
    if (rs) {
      sessionStorage.setItem(cfg.train.passengerData, rs);
      if (cb) cb(eval('(' + rs + ')'));
    }
  });
  // }
}
// 获取经停信息
function getJingTinInfoFun(val, cb) {
  let rc = sessionStorage.getItem(cfg.train.TJ_Info);
  if (rc && cb) {
    cb(eval('(' + rc + ')'));
  } else {
    ajax.get(`${cfg.train.host}${cfg.train.getAct}${cfg.train.gettrainbycode}&traincode=${val}`, '', (rs) => {
      if (rs) {
        sessionStorage.setItem(cfg.train.TJ_Info, rs);
        if (cb) cb(JSON.parse(rs));
        // if (cb) cb(eval('(' + rs + ')'));
      }
    });
  }
}
function strfind(str, val) {
  if (!str , !val) return;
  if (str instanceof Array) str.join(',');
  return new RegExp(',' + val + ',').test(',' + str + ',');
}

// 身份证
function hideIdcard(e) {
  let reg = /^(.{3})(?:\d+)(.{4})$/;
  if (e.length <= 10) {
    reg = /^(.{2})(?:\d+)(.{2})$/;
  }
  let data = {
    hide: e.replace(reg, '$1****$2'),
    show: e,
  };
  return data;
}

function isEmptyObj(obj) {
  for (let key in obj) {
    return false
  }
  return true
}

/*
 * 标签页切换
 * @param 一组同级的选择器（数组）
 * */
function tabSwitch(els, cb) {
  if (els && els.length <= 0) return;
  els.forEach(function (el) {
    el.onclick = () => {
      els.forEach(function (child) {
        $.removeClass(child, 'active');
      });
      $.addClass(el, 'active');
      if (cb && cb instanceof Function) cb(el);
    }
  });
}

function getTrainCityFun(cb) {
  let rc = cityDataCache();
  if (rc) {
    // console.log('本地存储', rc);
    if (cb instanceof Function) cb(rc);
  } else {
    // 正式地址
    // ajax.get(`${cfg.train.host}${cfg.train.getAct}${cfg.train.stationlist}`, '', (rs) => {
    // 测试地址
    ajax.get('http://flight-10038118.cossh.myqcloud.com/train/res/lib/trainCityLib.txt', '', (rs) => {
      if (rs) {
        let rc = JSON.parse(rs);
        if (rc && rc.data) {
          rc = rc.data;
          cityDataCache(rc);
          if (cb instanceof Function) cb(rc);
          // console.log('rc', rc);
        }
      }
    });
  }
}

function trainPact(cb) {
  let rc = localStorage.getItem(cfg.train.trainPact);
  if (rc) {
    if (cb instanceof Function) cb(rc);
  } else {
    ajax.get(`${cfg.doc.host}${cfg.doc.trainPact}`, '', (rs) => {
      if (rs) {
        localStorage.setItem(cfg.train.trainPact, rs);
        if (cb instanceof Function) cb(rs);
      }
    });
  }
}

// 删除数组指定元素
// @param arr 数组
// @param id 数组元素值
function removeArrEl(arr, id) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] instanceof Object) {
      if (arr[i][0] == id) {
        arr.splice(i, 1);
        break;
      }
    } else if (new String(arr[i]) instanceof String) {
      if (arr[i] == id) {
        console.log(arr[i] == id);
        arr.splice(i, 1);
        break;
      }
    }
  }
  return arr;
}
function convertPinyin(code, pinyin) {
  //汉字转换为拼音
  let rc = [];
  for (let i = 0, d = code, len = code.length; i < len; i++) {
    for (let key in pinyin) {
      if (pinyin[key].indexOf(d[i]) > -1) rc.push(key);
    }
  }
  // console.log(rc);
  return rc;
}
export {formatDate, getCurrDay, randomColor, isArrContain, isArrNoContain, findStr, backPage, getPrevDate, getNextDate, isSelector, message, closeMsg, getPinYin, getPassengers, strfind, hideIdcard, isEmptyObj, getJingTinInfoFun, tabSwitch, cityDataCache, getTrainCityFun, trainPact, removeArrEl, removeCls, convertPinyin};